package lider;

import java.util.ArrayList;
import java.util.Iterator;

//Para hacer las pruebas posta, tenemos que usar esto:
import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.EstadoErroneoException;

import excepciones.AsientoYaSobreReservadoPorElUsuarioException;

public class GestionadorLanchita extends Gestionador {
	private static AerolineaLanchita aerolineaLanchita = AerolineaLanchita.getInstance();
	//private static MockAerolineaLanchita aerolineaLanchita = new MockAerolineaLanchita();
	// Esto es para cuando usan los test
	
	private double porcentaje;

	// TODO checkear que todo este bien

	public GestionadorLanchita() {
		porcentaje = 0.15;
		this.setAerolinea(Aerolinea.aerolineaLANCHITA);
	}

	public Asiento parsearAsiento(Object asientoParaParsear) {
		String[] asientoAParsear = (String[]) asientoParaParsear;
		Asiento asiento = new Asiento();
		String[] codigoDeVueloAsiento = asientoAParsear[0].split("-");
		// Esto separa el numero de vuelo con el numero de asiento

		// Empiezo a rellenar el objeto creado
		asiento.setCodigoDeVuelo(codigoDeVueloAsiento[0]);
		asiento.setCodigoDeAsiento(codigoDeVueloAsiento[1]);
		asiento.setPrecio(asientoAParsear[1]);
		asiento.setClase(asientoAParsear[2]);
		asiento.setUbicacion(asientoAParsear[3]);
		asiento.setReservado(asientoAParsear[4] != "D");
		asiento.setDNIDelQueLoReservo(asientoAParsear[5]);
		asiento.setHoraDeSalida(asientoAParsear[6]);
		asiento.setHoraDeLlegada(asientoAParsear[7]);
		asiento.setOrigen(asientoAParsear[8]);
		asiento.setDestino(asientoAParsear[9]);
		asiento.setFechaDeSalida(asientoAParsear[10]);
		asiento.setFechaDeLlegada(asientoAParsear[11]);

		return asiento;
	}

	public ArrayList<Asiento> buscarAsientosSinFecha(String origen,
			String destino) {
		ArrayList<Asiento> asientosADevolver = new ArrayList<Asiento>();

		String[][] asientos = aerolineaLanchita.asientosDisponibles(origen,
				destino, null, null, null, null);

		// Con este primer for queremos meter en asientosADevolver cada asiento
		for (int j = 0; j < asientos.length; j++) {
			Asiento asiento = this.parsearAsiento(asientos[j]);
			asiento.setAerolinea(Aerolinea.aerolineaLANCHITA);
			asientosADevolver.add(asiento);
		}

		return asientosADevolver;
	}

	public ArrayList<Asiento> buscarAsientosQueTengan(String origen,
			String destino, String fecha) {

		String[][] asientos;
		ArrayList<Asiento> asientosADevolver = new ArrayList<Asiento>();
		Parser flexible = new ParseadorFlexible();
		Fecha fechaDeBusqueda = new Fecha(flexible, fecha);

		asientos = aerolineaLanchita.asientosDisponibles(origen, destino, null,
				null, null, null);

		// Con este primer for queremos meter en asientosADevolver cada asiento
		for (int j = 0; j < asientos.length; j++) {

			Asiento asiento = this.parsearAsiento(asientos[j]);
			Fecha fechaSalidaFormateada = new Fecha(flexible,
					asiento.getFechaDeSalida());
			Fecha fechaLlegadaFormateada = new Fecha(flexible,
					asiento.getFechaDeLlegada());

			// Ahora que ya sabemos qué campos tiene el asiento, lo metemos en
			// la lista de asientos que vamos a devolver.
			if (fechaSalidaFormateada.esAnteriorOIgualA(fechaDeBusqueda)
					&& fechaDeBusqueda
							.esAnteriorOIgualA(fechaLlegadaFormateada))
				asientosADevolver.add(asiento);

		}

		return asientosADevolver;
	}

	public void comprarAsiento(Asiento asiento, String dni) {
		try {
			String codigoDeVueloAsiento = asiento.getCodigoDeVuelo() + "-"
					+ asiento.getCodigoDeAsiento();
			aerolineaLanchita.comprar(codigoDeVueloAsiento);
		} catch (AsientoLanchitaNoDisponibleException e) {
			throw new BusinessException(
					"La aerolínea informa que el asiento ya está ocupado");
		}

		// si logra comprar el asiento, se remueve la lista de sobrereservas correspondiente
		this.buscarListaSobreReservaYRemover (asiento);
		
	}

	@Override
	public double impuestos(Asiento asiento) {
		double impuestos = Double.parseDouble(asiento.getPrecio());
		impuestos = impuestos * this.porcentaje;
		return impuestos;
	}

	@Override
	public void reservarAsiento(String dni, Asiento asiento) {
		// variables -----------------------------------------------------------------------
		
		// se genera el codigo del asiento sumando el codigo de vuelo y el codigo de asiento
		String codigoDeAsiento = asiento.getCodigoDeVuelo() + "-" + asiento.getCodigoDeAsiento();
		
		// codigo --------------------------------------------------------------------------
		
		// al tratar de reservar el asiento, aerolinea lanchita no devuelve nada
		// si se reserva correctamente, pero si no se puede reservar, va a lanzar
		// una excepcion EstadoErroneoException
		try {
			aerolineaLanchita.reservar(codigoDeAsiento, dni);
		} catch (EstadoErroneoException mensaje) {
			// como no se pudo reservar debido que el asiento ya lo esta
			// sobrereservo el asiento
			
			this.sobreReservarAsiento(dni, asiento);

		}

}

	
}
